package com.chenjian.configs.mpconfig;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

/**
 * mp自动填充功能配置项，一般用于全局自动化处理默认值，常用于时间，需要配合entity的注解@TableField(fill = FieldFill.**)使用
 * <p>
 * 注意：
 * 1.该配置有一定的性能损耗，不应该广泛使用
 * 2.添加前置判断，规避手动赋值
 * 3.添加前置判断，规避广泛字段属性扫描
 * 4.该配置类可以直接移植复用（mp编辑版本>=3.3.1.tmp）
 */
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {


    /**
     * 插入数据默认填充项
     *
     * @param metaObject
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        long currentTimeMillis = System.currentTimeMillis();
        if (null == getFieldValByName(MP_ENUMS.CREATE_TIME.getFieldName(), metaObject) && metaObject.hasSetter(MP_ENUMS.CREATE_TIME.getFieldName()))
            this.fillStrategy(metaObject, MP_ENUMS.CREATE_TIME.getFieldName(), currentTimeMillis);
        if (null == getFieldValByName(MP_ENUMS.UPDATE_TIME.getFieldName(), metaObject) && metaObject.hasSetter(MP_ENUMS.UPDATE_TIME.getFieldName()))
            this.fillStrategy(metaObject, MP_ENUMS.UPDATE_TIME.getFieldName(), currentTimeMillis);
       /* if (null == getFieldValByName(MP_ENUMS.VERSION.getFieldName(), metaObject) && metaObject.hasSetter(MP_ENUMS.VERSION.getFieldName()))
            this.fillStrategy(metaObject, MP_ENUMS.VERSION.getFieldName(), 1);
        if (null == getFieldValByName(MP_ENUMS.DELETED.getFieldName(), metaObject) && metaObject.hasSetter(MP_ENUMS.DELETED.getFieldName()))
            this.fillStrategy(metaObject, MP_ENUMS.DELETED.getFieldName(), 1);*/

    }

    /**
     * 更新数据默认填充项
     *
     * @param metaObject
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        /*long currentTimeMillis = System.currentTimeMillis();
        System.out.println(currentTimeMillis);
        Object fieldValByName = getFieldValByName(MP_ENUMS.UPDATE_TIME.getFieldName(), metaObject);
        System.out.println(fieldValByName);
        this.fillStrategy(metaObject, MP_ENUMS.UPDATE_TIME.getFieldName(), currentTimeMillis);*/

        /**
         * 无差别更新updateTime字段值
         */
        setFieldValByName(MP_ENUMS.UPDATE_TIME.getFieldName(), System.currentTimeMillis(), metaObject);
    }

}
